// 对形参解构赋值 并设置默认值
// 返回值 promise对象
function axios ({url , params = {}, data={}, method= 'get'}){
  return new Promise((res,rej)=>{
    // 创建xhr对象
    const xhr = new XMLHttpRequest()
    // 根据params参数拼接成query参数  (query参数是路径参数? )
    let queryStr = Object.keys(params).reduce((pre,cur)=>{
      // query参数 是一段字符串  
      pre += `&${cur}=${params[cur]}`
      return pre
    },'')

    if(queryStr.length > 0){
      // substring() 返回一个字符串  参数:(开始索引, 结束索引) 
      queryStr = queryStr.substring(1)
      url += '?' + queryStr
    }

    // 请求方式转换为大写  (可写可不写)
    // method = method.toUpperCase()

    // 初始化一个异步请求(还没发送请求)
    xhr.open(method,url)
    // 监听事件
    xhr.onreadystatechange = ()=>{
      // 如果状态值不为4 直接结束
      if(xhr.readyState !== 4) return
      if(xhr.status >= 200 && xhr.status < 300){
        // 准备响应数据对象
        const responseData = {
          data: JSON.parse(xhr.response),
          status: xhr.status,
          statusText: xhr.statusText
        }
        // 指定promise成功及回调
        res(responseData)
      }else{
        // 请求失败
        const error = new Error('xhr error status' + xhr.status)
        rej(error)
      }
    }


    // 如果post / put请求
    if(method === 'post' || method === 'put' || method === 'delete'){
      // 设置请求头 使请求体参数以json形式传递
      xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8')
      // 包含所有请求参数的对象转换为json格式
      const dataJson = JSON.stringify(data)
      xhr.send(dataJson)
    }else{
      // get请求
      xhr.send()
    }



  })

}